package com.demo.common.utils.compare;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.function.Function;

/**
 * @Author xinge001
 * @Date 2024/03/18 10:40
 * @Description 字段对比注解
 * @Version 1.0.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Inherited
public @interface FieldCompare {

    /**
     * 日志记录格式，默认是xxx由a变为b这种格式，实现的占位符依次是字段名称，原值，新值。
     * 如果要调整format且使用占位符，必须遵守此规定。也可以不用占位符，比如直接附件发生了变更
     * @return
     */
    String format() default "{0}由{1}变为{2}";

    /**
     * 字段名称，不填默认字段名称
     * @return
     */
    String name() default "";

    /**
     * 值对比转换器，默认用equals比较，如果配置的转换器不存在默认使用{@link Function#identity()}方法处理(相当于不处理，等于原值)
     * @see com.demo.common.utils.compare.FieldCompareUtils#registerValue(String, Function)
     * @return
     */
    String valueConvert() default "";

    /**
     * 展示字段转换器,如果配置的转换器不存在默认使用{@link Object#toString()}方法处理
     * {@link com.demo.common.utils.compare.FieldCompareUtils#registerShow(String, Function)}
     * @return
     */
    String showConvert() default "";

    /**
     * null值转换，默认null值输出-
     * @return
     */
    String nullValue() default "-";

    /**
     * 特殊标识，用于业务判断，比如该字段改变会触发事件等。{@link FieldCompareUtils.CompareResult#getSpecialCheck()}
     * @return
     */
    boolean special() default false;

}
